package org.zjt.book

/**
  * Stream ：懒加载（实现大文件的操作）
  *
  *  #:: 在Stream后追加流元素
  *  take：        得到Stream的前几个元素的Stream
  *  tail：        得到从下一个元素开始的Stream
  *  Stream(100): 得到该Stream第一个元素
  *  force ：     得到Stream懒加载生成的Stream
 */
object StreamTest extends App {

  /**1、 得到一个无限的数组Stream */
  def numsStream( n : BigInt ) : Stream[BigInt] = n #:: numsStream( n + 1 )

  /**2、 懒加载：构造一个起点为100的流 */
  var numStream = numsStream(100)

  /**3、 懒加载： 该流的第100个元素   该流变为 101-200 的Stream*/
  println(numStream(100))


  /** 4、得到Stream的下一个Stream      tail得到该Stream的下一个元素开始的Stream（跳过一个元素）     */
  println(numStream.tail)


  /**1、 得到一个无限的数组Stream */
  numStream = numsStream(100)


  /**2、take 得到无限数组中前五个元素    force ：执行懒加载*/
  println(numStream.map( x => x * x).take(5).force)

  // TODO: error: 将会计算整个Stream的元素
  // println(numStream.map( x => x * x).force)
}
